package com.effvi.jdk.socket;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * Socket发送文件(发送文件)
 * @author kelvin.zhang
 *
 */
public class SendFile implements Runnable {  
	public void run() {  
	    StringBuffer ta1 = new StringBuffer(""); 
	    File file = new File("d:");
	    String ServerIp = "192.168.0.249";
	    int port = 200;
	    try {
	     // 通过打开一个到实际文件的连接来创建一个 FileInputStream，该文件通过文件系统中的 File 对象  
	     // file 指定。  
	     FileInputStream fos = new FileInputStream(file);  
	     Socket socket = new Socket(ServerIp, port);// 创建连接到指定服务器的套接字  
	     socket.setSoTimeout(20);  
	     DataOutputStream out = new DataOutputStream(socket.getOutputStream());  
	     out.writeUTF(file.getName());// 以与机器无关方式使用 UTF-8  修改版编码将一个字符串写入基础输出流。  
	     ta1.append("File " + file.getName() + " begins to send!\n");  
	     OutputStream netOut = socket.getOutputStream();  
	     // BufferedOutputStream,该类实现缓冲的输出流。通过设置这种输出流，应用程序就可以将各个字节写入基础输出流中，而不必为每次字节写入调用基础系统。  
	     OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));  
	     byte[] buf = new byte[2048];  
	     // 从此输入流中将最多 buf.length 个字节的数据读入一个字节数组中。  
	     int num = fos.read(buf);  
	     if (num != (-1))  
	      ta1.append("File is sending...\n");  
	     while (num != (-1))// 是否读完文件  
	     {  
	      doc.write(buf, 0, num);// 将指定字节数组中从偏移量0 开始的 num个字节写入基础输出流。  
	      doc.flush();// 清空此数据输出流。  
	      num = fos.read(buf);// 继续从文件中读取数据  
	     }  
	     if (num == (-1))  
	      ta1.append("The file sending is over.\n");  
	     fos.close();  
	     netOut.close();  
	     Thread.sleep(500);  
	    } catch (Exception ex) {  
	  }  
	}   
}